home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 March / EnigmA AMIGA RUN 05 (1996)(G.R. Edizioni)(IT)[!][issue 1996-03][Skylink CD IV].iso / earcd / assembler / progasm1.lha / SORGENTI2 / LEZIONE6m.s < prev    next >
Text File  |  1994-07-23  |  8KB  |  261 lines

  1.  
  2. ; Lezione6m.s    EFFETTO "RIMBALZO" TRAMITE L'USO DI UNA TABELLA
  3.  
  4.  
  5.     SECTION    CiriCop,CODE
  6.  
  7. Inizio:
  8.     move.l    4.w,a6        ; Execbase
  9.     jsr    -$78(a6)    ; Disable
  10.     lea    GfxName(PC),a1    ; Nome lib
  11.     jsr    -$198(a6)    ; OpenLibrary
  12.     move.l    d0,GfxBase
  13.     move.l    d0,a6
  14.     move.l    $26(a6),OldCop    ; salviamo la vecchia COP
  15.  
  16. ;    Puntiamo la PIC
  17.  
  18.     MOVE.L    #PIC,d0        ; dove puntare
  19.     LEA    BPLPOINTERS,A1    ; puntatori COP
  20.     MOVEQ    #2,D1        ; numero di bitplanes -1 (qua sono 3)
  21. POINTBP:
  22.     move.w    d0,6(a1)
  23.     swap    d0
  24.     move.w    d0,2(a1)
  25.     swap    d0
  26.     ADD.L    #40*256,d0    ; + lunghezza bitplane
  27.     addq.w    #8,a1
  28.     dbra    d1,POINTBP
  29.  
  30.     move.l    #COPPERLIST,$dff080    ; nostra COP
  31.     move.w    d0,$dff088        ; START COP
  32.     move.w    #0,$dff1fc        ; NO AGA!
  33.     move.w    #$c00,$dff106        ; NO AGA!
  34.  
  35. mouse:
  36.     cmpi.b    #$ff,$dff006    ; Linea 255?
  37.     bne.s    mouse
  38.  
  39.     bsr.w    Rimbalzo    ; Fa "rimbalzare" la PIC tramite una tabella
  40.                 ; gia' predisposta.
  41.  
  42. Aspetta:
  43.     cmpi.b    #$ff,$dff006    ; linea 255?
  44.     beq.s    Aspetta
  45.  
  46.     btst    #6,$bfe001    ; mouse premuto?
  47.     bne.s    mouse
  48.  
  49.     move.l    OldCop(PC),$dff080    ; Puntiamo la cop di sistema
  50.     move.w    d0,$dff088        ; facciamo partire la vecchia cop
  51.  
  52.     move.l    4.w,a6
  53.     jsr    -$7e(a6)    ; Enable
  54.     move.l    gfxbase(PC),a1
  55.     jsr    -$19e(a6)    ; Closelibrary
  56.     rts
  57.  
  58. ;    Dati
  59.  
  60. GfxName:
  61.     dc.b    "graphics.library",0,0
  62.  
  63. GfxBase:
  64.     dc.l    0
  65.  
  66. OldCop:
  67.     dc.l    0
  68.  
  69. ; Questa volta usiamo una tabella che contiene i valori da sottrarre ai
  70. ; puntatori dei bitplanes per simulare un "rimbalzo" della figura, anziche' un
  71. ; ovvio movimento SU-GIU con add.l #40 e sub.l #40. Per fare cio' e' bastato
  72. ; fare una tabella, appunto, con i valori da sottrarre al puntatore, che
  73. ; chiaramente sono multipli del 40, dove 2*40 indica che si saltano 2 linee,
  74. ; mentre 3*40 che se ne saltano 3 alla volta:
  75. ;
  76. ;    dc.l    40,40,2*40,2*40    ; esempio...
  77. ;
  78. ; Per tornare alla posizione iniziale una volta arrivati in fondo allo schermo
  79. ; occorre aggiungere quanto e' stato tolto ai puntatori bitplanes, dunque,
  80. ; essendo presente nella routine una sottrazione:
  81. ;
  82. ;    sub.l    d1,d0    ; sottrai il valore della tabella (d1) all'indirizzo
  83. ;            ; che sta puntando il bplpointer
  84. ;
  85. ; come facciamo ad AGGIUNGERE con un SUB?? Semplice! Basta SOTTRARRE numeri
  86. ; negativi!!! Quanto fa 10-(-1)? Fa 11!!! Dunque nella tabella sono presenti
  87. ; i numeri negativi dopo aver toccato "il fondo":
  88. ;
  89. ;    dc.l    -8*40,-6*40,-5*40        ; risaliamo
  90. ;
  91. ; un sub.l #-8*40 e' come un add.l #8*40.
  92. ; Ricordate pero' che i numeri negativi tengono "il segno" sul bit piu' alto?
  93. ; per cui un -40 e' $FFFFFFd8, e' per questo che i valori della tabella sono
  94. ; in LONGWORD e non in WORD, per contenere numeri negativi.
  95. ; Infatti un:
  96. ;
  97. ; dc.w -40
  98. ;
  99. ; Non viene assemblato, da errore, dovete usare .l per i numeri negativi.
  100. ;
  101. ; Avendo usato i valori .L, bisogna ricordarselo nella routine:
  102. ;
  103. ; ADDQ.L #4,RIMTABPOINT
  104. ; FINERIMBALZTAB-4
  105. ; dc.l RIMBALZTAB-4
  106. ;
  107. ; e non
  108. ;
  109. ; ADDQ.L #2,RIMTABPOINT
  110. ; FINERIMBALZTAB-2
  111. ; dc.l RIMBALZTAB-2
  112. ;
  113. ; Per quanto riguarda lo spostamento vero e proprio non ci sono novita':
  114. ; preleviamo l'indirizzo da BPLPOINTERS, facciamo il SUB con il valore letto
  115. ; in tabella e ripuntiamo il nuovo indirizzo.
  116.  
  117. Rimbalzo:
  118.     LEA    BPLPOINTERS,A1    ; Con queste 4 istruzioni preleviamo dalla
  119.     move.w    2(a1),d0    ; copperlist l'indirizzo dove sta puntando
  120.     swap    d0        ; attualmente il $dff0e0 e lo poiniamo in d0
  121.     move.w    6(a1),d0
  122.  
  123.     ADDQ.L    #4,RIMTABPOINT    ; Fai puntare alla longword successiva
  124.     MOVE.L    RIMTABPOINT(PC),A0 ; indirizzo contenuto in long RIMTABPOINT
  125.                    ; copiato in a0
  126.     CMP.L    #FINERIMBALZTAB-4,A0 ; Siamo all'ultima longword della TAB?
  127.     BNE.S    NOBSTART2        ; non ancora? allora continua
  128.     MOVE.L    #RIMBALZTAB-4,RIMTABPOINT ; Riparti a puntare dalla prima long
  129. NOBSTART2:
  130.     MOVE.l    (A0),d1        ; copia la long dalla tabella in d1
  131.  
  132.     sub.l    d1,d0        ; sottraiamo il valore attualmente preso dalla
  133.                 ; tabella, facendo scorrere la figura SU o GIU.
  134.  
  135.     LEA    BPLPOINTERS,A1    ; puntatori nella COPPERLIST
  136.     MOVEQ    #2,D1        ; numero di bitplanes -1 (qua sono 3)
  137. POINTBP2:
  138.     move.w    d0,6(a1)    ; copia la word BASSA dell'indirizzo del plane
  139.     swap    d0        ; scambia le 2 word di d0 (es: 1234 > 3412)
  140.     move.w    d0,2(a1)    ; copia la word ALTA dell'indirizzo del plane
  141.     swap    d0        ; scambia le 2 word di d0 (es: 3412 > 1234)
  142.     ADD.L    #40*256,d0    ; + lunghezza bitplane -> prossimo bitplane
  143.     addq.w    #8,a1        ; andiamo ai prossimi bplpointers nella COP
  144.     dbra    d1,POINTBP2    ; Rifai D1 volte POINTBP (D1=num of bitplanes)
  145.     rts
  146.  
  147.  
  148. RIMTABPOINT:            ; Questa longword "PUNTA" a RIMBALZTAB, ossia
  149.     dc.l    RIMBALZTAB-4    ; contiene l'indirizzo di RIMBALZTAB. Terra'
  150.                 ; l'indirizzo del'ultima long "letta" dentro
  151.                 ; la tabella. (qua inizia da RIMORTAB-4 in
  152.                 ; quanto Lampeggio inizia con un ADDQ.L #4,C..
  153.                 ; serve per "bilanciare" la prima istruzione.
  154.  
  155. ;    La tabella con i valori "precalcolati" del rimbalzo
  156.  
  157. RIMBALZTAB:
  158.     dc.l    0,0,0,0,0,0,40,40,40,40,40,40,40,40,40         ; scendiamo
  159.     dc.l    40,40,2*40,2*40
  160.     dc.l    2*40,2*40,2*40,2*40,2*40
  161.     dc.l    3*40,3*40,3*40,3*40,3*40,4*40,4*40,4*40,5*40,5*40
  162.     dc.l    6*40,8*40                    ; in fondo
  163.     dc.l    -8*40,-6*40,-5*40                ; risaliamo
  164.     dc.l    -5*40,-4*40,-4*40,-4*40,-3*40,-3*40,-3*40,-3*40,-3*40
  165.     dc.l    -2*40,-2*40,-2*40,-2*40,-2*40
  166.     dc.l    -2*40,-2*40,-40,-40
  167.     dc.l    -40,-40,-40,-40,-40,-40,-40,-40,-40,0,0,0,0,0    ; siamo in cima
  168. FINERIMBALZTAB:
  169.  
  170.  
  171.     SECTION    GRAPHIC,DATA_C
  172.  
  173. COPPERLIST:
  174.     dc.w    $120,0,$122,0,$124,0,$126,0,$128,0 ; SPRITE
  175.     dc.w    $12a,0,$12c,0,$12e,0,$130,0,$132,0
  176.     dc.w    $134,0,$136,0,$138,0,$13a,0,$13c,0
  177.     dc.w    $13e,0
  178.  
  179.     dc.w    $8E,$2c81    ; DiwStrt
  180.     dc.w    $90,$2cc1    ; DiwStop
  181.     dc.w    $92,$38        ; DdfStart
  182.     dc.w    $94,$d0        ; DdfStop
  183.     dc.w    $102,0        ; BplCon1
  184.     dc.w    $104,0        ; BplCon2
  185.     dc.w    $108,0        ; Bpl1Mod
  186.     dc.w    $10a,0        ; Bpl2Mod
  187.  
  188.             ; 5432109876543210
  189.     dc.w    $100,%0011001000000000    ; bits 13 e 12 accesi!! (3 = %011)
  190.  
  191. BPLPOINTERS:
  192.     dc.w $e0,$0000,$e2,$0000    ;primo     bitplane
  193.     dc.w $e4,$0000,$e6,$0000    ;secondo bitplane
  194.     dc.w $e8,$0000,$ea,$0000    ;terzo     bitplane
  195.  
  196.     dc.w    $0180,$000    ; color0
  197.     dc.w    $0182,$475    ; color1
  198.     dc.w    $0184,$fff    ; color2
  199.     dc.w    $0186,$ccc    ; color3
  200.     dc.w    $0188,$999    ; color4
  201.     dc.w    $018a,$232    ; color5
  202.     dc.w    $018c,$777    ; color6
  203.     dc.w    $018e,$444    ; color7
  204.  
  205.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  206.  
  207.  
  208.     dcb.b    80*40,0    ; spazio azzerato per lo scroll del bitplane
  209.  
  210. PIC:
  211.     incbin    "amiga.320*256*3"    ; qua carichiamo la figura in RAW,
  212.  
  213.     end
  214.  
  215. Programmare una demo o un gioco significa anche fare una miriade di tabelle.
  216. Quella usata in questo listato potrebbe esser utile per il salto di un ometto
  217. protagonista di un platform; i giochi programmati male e con linguaggi non
  218. adatti spesso difettano piu' del fatto che i movimenti non sono naturali che
  219. della lentezza o altro. Immaginatevi che il protagonista di un platform salti
  220. in alto con un add e improvvisamente arrivato in alto scenda con un sub.
  221. L'effetto sarebbe terribilmente brutto. Anche i movimenti ondeggianti degli
  222. alieni di uno sparatutto contano molto, e sono il frutto di tabelle.
  223. Complicando le cose i programmatori bravucci si fanno un certo numero di
  224. tabelle tutte per il salto del personaggio, e a seconda del movimento di
  225. questo o del tempo di pressione del pulsante fanno fare la curva di salto
  226. giusta secondo la tabella giusta, oppure aggiungono dei valori a quelli della
  227. tabella base, o mischiano i valori di molte tabelle. In casi estremi come
  228. i giochi di flipper bisogna proprio farsi una routine che calcola i rimbalzi e
  229. la gravita', ma questo non esclude che la routine abbia tabelle al suo interno;
  230. comunque in un gioco di flipper si muove solo la pallina (lo schermo del
  231. flipper basta muoverlo cambiando i puntatori dei bitplanes) e si puo' perdere
  232. tempo a calcolarsi il movimento, in un altro tipo di gioco si usano le tabelle.
  233. Imparate ad usare la routine che legge i valori dalla tabella e usatela per
  234. modificare esempi precedenti, per far muovere, ad esempio, le barrette copper
  235. in modo strano e oscillante.
  236.  
  237. Provate a sostituire la tabella con questa: provoca una "fluttuazione"
  238. oscillatoria anziche' un rimbalzo. (usate Amiga+b+c+i)
  239.  
  240.  
  241. RIMBALZTAB:
  242.     dc.l    0,0,40,40,40,40,40,40,40,40,40             ; in cima
  243.     dc.l    40,40,2*40,2*40
  244.     dc.l    2*40,2*40,2*40,2*40,2*40            ; acceleriamo
  245.     dc.l    3*40,3*40,3*40,3*40,3*40
  246.     dc.l    3*40,3*40,3*40,3*40,3*40
  247.     dc.l    2*40,2*40,2*40,2*40,2*40            ; deceleriamo
  248.     dc.l    2*40,2*40,40,40
  249.     dc.l    40,40,40,40,40,40,40,40,40,0,0,0,0,0,0,0    ; in fondo
  250.     dc.l    -40,-40,-40,-40,-40,-40,-40,-40,-40
  251.     dc.l    -40,-40,-2*40,-2*40
  252.     dc.l    -2*40,-2*40,-2*40,-2*40,-2*40
  253.     dc.l    -3*40,-3*40,-3*40,-3*40,-3*40            ; acceleriamo
  254.     dc.l    -3*40,-3*40,-3*40,-3*40,-3*40
  255.     dc.l    -2*40,-2*40,-2*40,-2*40,-2*40            ; deceleriamo
  256.     dc.l    -2*40,-2*40,-40,-40
  257.     dc.l    -40,-40,-40,-40,-40,-40,-40,-40,-40,0,0,0,0,0    ; in cima
  258. FINERIMBALZTAB:
  259.  
  260.  
  261.